package com.example.demo_one.app.service;


import org.springframework.data.redis.core.BoundValueOperations;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * redis公共服务
 *
 * @author
 */
public interface RedisService {

    final static String RIGHTLIST="right";
    final static String LEFTLIST="left";

    //////////////////////直接

    /**
     * 删除单个key
     *
     * @param key
     */
    public void deleteSingleKey(Object key);

    /**
     * 删除多个key
     *
     * @param keys
     */
    public void deleteMultipleKey(List<Object> keys);

    /**
     * key指定过期时间
     *
     * @param key
     * @param time
     */
    public void expire(Object key, Long time, TimeUnit timeUnit);

    /**
     * 获取指定key的过期时间
     *
     * @param key
     * @return
     */
    public Long getExpire(Object key);

    /**
     * 判断key是否存在
     *
     * @param key
     * @return
     */
    public boolean isHasKey(Object key);

    ///////////////////////String

    /**
     * 通过BoundValueOperations 设置值 String
     *
     * @param key
     * @param value
     * @return
     */
    public void setStringKeyBoundValueOperations(Object key, Object value);

    /**
     * 通过ValueOperations设置值 String
     *
     * @param hashMapKeyAndValue
     * @return
     */
    public void setStringKeyValueOperations(HashMap<Object, Object> hashMapKeyAndValue);

    /**
     * 通过BoundValueOperations获取到值   String
     *
     * @param key
     * @return
     */
    public Object getStringKeyBoundValueOperations(Object key);

    /**
     * 通过ValueOperations获取到值    String
     *
     * @param keys
     * @return
     */
    public List<Object> getStringKeyValueOperations(List<Object> keys);

    ///////////////////Hash

    /**
     * 通过BoundValueOperations 设置值 Hash
     *
     * @param key
     * @param value
     * @return
     */
    public void setHashKeyBoundValueOperations(Object key, HashMap<Object, Object> value);

    /**
     * 通过BoundValueOperations 添加整个map集合
     *
     * @param hashMapKeyAndValue
     * @return
     */
    public void setHashKeyBoundValueOperationsHashMap(HashMap<Object, HashMap<Object, Object>> hashMapKeyAndValue);

    /**
     * 通过HashOperations设置值 Hash
     *
     * @param key
     * @param valueMap
     * @return
     */
    public void setHashKeyHashOperations(Object key, HashMap<Object, Object> valueMap);

    /**
     * 通过BoundValueOperations获取到值  获取所有的键值对集合
     *
     * @param key
     * @return
     */
    public Map getHashKeyBoundValueOperations(Object key);

    /**
     * 提取所有的value值
     *
     * @return
     */
    public List getHashKeyList(Object key);

    /**
     * 根据key提取value值
     *
     * @param key
     * @return
     */
    public Object getHashKeyString(Object key,Object valueKey);

    /**
     * 删除对应key的value的map的value
     * @param key
     * @param valueKeys
     */
    public void deleteHashMapValue(Object key, List<Object> valueKeys);

    /**
     * 判断指定key的value的value是否存在
     * @param key
     * @param valueKey
     * @return
     */
    public boolean isHashMapOfValueKey(Object key,Object valueKey);

    //////////////////////////////Set

    /**
     * 添加Set缓存
     * @param key
     * @param values
     */
    public void setSetKey(Object key,List<Object> values);

    /**
     * 获取到对应key所有的value
     * @param key
     * @return
     */
    public Set<Object> getSetKey(Object key);

    /**
     * 判断Set中某值是否存在
     * @param key
     * @param value
     * @return
     */
    public boolean isSetValue(Object key,Object value);

    /**
     * 删除Set的value
     * @param key
     * @param values
     */
    public void deleteSetValue(Object key,List<Object> values);

    /**
     * 获取Set的缓存长度
     * @param key
     * @return
     */
    public Long getSetSize(Object key);

    //////////////////////////List

    /**
     * 添加数据到List
     * @param flag
     * @param key
     * @param valueList
     */
    public void setListKey(String flag,Object key,List<Object> valueList);


    /**
     * 获取List集合Value
     * @param key
     * @param start
     * @param end
     */
    public List getListKey(Object key, Long start, Long end);

    /**
     * 获取指定位置的value
     * @param key
     * @param index
     * @return
     */
    public Object getListKeyIndex(Object key, Long index);

    /**
     * 根据索引修改值
     * @param key
     * @param index
     * @param value
     */
    public void updateListKey(Object key,Long index,Object value);

    /**
     * 移除指定索引的值
     * @param key
     * @param index
     * @param value
     */
    public void deleteListKey(Object key,Long index,Object value);
}
